#ifndef UNIFIEDDRAGDROPHANDLER_H
#define UNIFIEDDRAGDROPHANDLER_H

#include <QObject>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QStringList>
#include <QUrl>
#include <QFileInfo>
#include <QDir>
#include <QImageReader>
#include <QMessageBox>
#include <QWidget>
#include "layoutstatemanager.h"

/**
 * UnifiedDragDropHandler - 统一拖拽处理器
 *
 * Martin Fowler Extract Class 重构：
 * 将重复的拖拽+智能布局逻辑提取到独立类中
 *
 * 职责：
 * 1. 统一处理拖拽事件（dragEnter + drop）
 * 2. 智能文件类型检测和布局选择
 * 3. 文件路径收集和验证
 * 4. 回调通知调用方处理结果
 *
 * 使用方式：
 * - 主窗口、文件列表窗口、缩略图窗口都使用同一个实例
 * - 通过回调函数处理具体的文件加载逻辑
 */
class UnifiedDragDropHandler : public QObject
{
    Q_OBJECT

public:
    // 重复文件处理策略
    enum class DuplicateStrategy {
        Skip,            // 跳过重复文件（默认）
        Reject,          // 拒绝所有文件如果有重复
        ReplaceExisting, // 替换现有重复文件
        AskUser          // 询问用户决策
    };

    // 增强的文件处理结果结构
    struct DragDropResult {
        QStringList validFiles;                       // 非重复的有效文件
        QStringList duplicateFiles;                  // 检测到的重复文件
        QStringList skippedFiles;                    // 跳过的文件
        QString primaryFilePath;                     // 主要文件路径
        QHash<QString, QString> duplicateMapping;    // 重复文件映射 (新文件->现有文件)

        // 便利方法
        bool hasValidFiles() const { return !validFiles.isEmpty(); }
        bool hasDuplicates() const { return !duplicateFiles.isEmpty(); }
        bool hasSkippedFiles() const { return !skippedFiles.isEmpty(); }
        bool hasMultipleFiles() const { return (validFiles.size() + duplicateFiles.size()) > 1; }
        int totalFiles() const { return validFiles.size() + duplicateFiles.size() + skippedFiles.size(); }
        
        // 生成摘要信息
        QString generateSummary() const;
    };

    // 文件处理回调函数类型
    using FileProcessCallback = std::function<void(const DragDropResult& result)>;

    explicit UnifiedDragDropHandler(QWidget* parentWidget, QObject* parent = nullptr);

    // === 拖拽事件处理 ===

    // === 拖拽事件处理 ===

    /**
     * 处理拖拽进入事件
     * @param event 拖拽进入事件
     * @return 是否接受拖拽
     */
    bool handleDragEnter(QDragEnterEvent* event);

    /**
     * 处理拖拽放下事件（增强版，支持重复文件检测）
     * @param event 拖拽放下事件
     * @param callback 文件处理回调函数
     * @param existingFiles 现有文件列表（用于重复检测）
     * @param strategy 重复文件处理策略
     * @return 是否成功处理
     */
    bool handleDrop(QDropEvent* event, const FileProcessCallback& callback, 
                   const QList<UnifiedFileInfo>& existingFiles = QList<UnifiedFileInfo>(),
                   DuplicateStrategy strategy = DuplicateStrategy::Skip);

    /**
     * 向后兼容的处理拖拽放下事件（原版本）
     * @param event 拖拽放下事件
     * @param callback 文件处理回调函数
     * @return 是否成功处理
     */
    bool handleDropLegacy(QDropEvent* event, const FileProcessCallback& callback);

    // === 重复文件棂测方法 ===

    /**
     * 检测文件列表中的重复项
     * @param filePaths 要检测的文件路径列表
     * @param existingFiles 现有文件列表
     * @param strategy 重复处理策略
     * @return 检测结果
     */
    DragDropResult checkForDuplicates(const QStringList& filePaths,
                                      const QList<UnifiedFileInfo>& existingFiles,
                                      DuplicateStrategy strategy = DuplicateStrategy::Skip);

    /**
     * 检测单个文件是否重复
     * @param filePath 文件路径
     * @param existingFiles 现有文件列表
     * @return 是否重复
     */
    static bool isFileAlreadyAdded(const QString& filePath, 
                                  const QList<UnifiedFileInfo>& existingFiles);

    /**
     * 策略枚举转字符串
     * @param strategy 策略枚举
     * @return 策略名称
     */
    static QString strategyToString(DuplicateStrategy strategy);

    // === 文件选择逻辑 ===

    /**
     * 从多个文件中选择主要文件
     * @param filePaths 文件路径列表
     * @return 主要文件路径
     */
    static QString selectPrimaryFile(const QStringList& filePaths);

private:
    QWidget* m_parentWidget;  // 用于显示错误消息的父窗口

    // === 文件处理辅助方法 ===

    /**
     * 从URL列表中提取有效的文件路径
     * @param urls URL列表
     * @return 有效文件路径列表
     */
    QStringList extractValidFilePaths(const QList<QUrl>& urls);

    /**
     * 检查文件是否为支持的格式
     * @param filePath 文件路径
     * @return 是否支持
     */
    static bool isSupportedFile(const QString& filePath);

    /**
     * 扫描目录中的支持文件
     * @param dirPath 目录路径
     * @return 目录中的支持文件列表
     */
    static QStringList scanDirectoryForSupportedFiles(const QString& dirPath);

    /**
     * 根据文件标识查找现有文件路径
     * @param fileIdentity 文件标识
     * @param existingFiles 现有文件列表
     * @return 现有文件路径
     */
    QString findExistingFileByIdentity(const QString& fileIdentity,
                                      const QList<UnifiedFileInfo>& existingFiles);

};

#endif // UNIFIEDDRAGDROPHANDLER_H